﻿using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Security.Services;
using Sinacor.UI.Bovespa.Operador.Communication.Bovespa.Operador.Operador;

namespace Sinacor.UI.Bovespa.Operador.Communication
{
    public class Operador : BaseCommunication
    {
        #region Construtor
        public Operador(SessionInformation sessionInformation) : base(sessionInformation) { }
        #endregion

        #region AtualizarPreferencias
        public void AtualizarPreferencias(Model.Preferencias request)
        {
            Bovespa.Operador.Operador.IOperador servico = null;

            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    servico.AtualizarPreferencias(new Translator.ModelToDataContract.Operador().ToPreferenciasRequest(request));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }
            finally
            {
                servico = null;
            }

        }
        #endregion

        #region ObterPreferencias
        public Model.Preferencias ObterPreferencias(System.Int32 request)
        {
            Bovespa.Operador.Operador.IOperador servico = null;
            Model.Preferencias retorno = null;

            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    Bovespa.Operador.Operador.CodigoOperadorRequest CodigoOperadorRequest = new Sinacor.UI.Bovespa.Operador.Communication.Bovespa.Operador.Operador.CodigoOperadorRequest();
                    CodigoOperadorRequest.Valor = request;
                    retorno = new Translator.DataContractToModel.Operador().ToPreferencias(servico.ObterPreferencias(CodigoOperadorRequest));
                }
            }
            catch (Exception ex)
            {
                base.HandleFault(ex);
            }

            return retorno;
        }

        #endregion

        //

        #region AlterarOperador

        public void AlterarOperador(Model.Operador request)
        {
            IOperador servico = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    servico.AlterarOperador(new Translator.ModelToDataContract.Operador().ToOperadorRequest(request));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region ConsultarCorretorasRelacionadas

        public ModelCollection<Model.Origem> ConsultarCorretorasRelacionadas(Model.Parameter.FiltroCodigoOperador request)
        {
            IOperador servico = null;
            ModelCollection<Model.Origem> retorno = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    retorno = new Translator.DataContractToModel.Operador().ToOrigem
                                (
                                    servico.ConsultarCorretorasRelacionadas(new Translator.ModelToDataContract.Operador().ToFiltroCodigoOperadorRequest(request))
                                );
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }

            return retorno;
        }

        #endregion

        #region ConsultarOperadores

        public ModelCollection<Model.Operador> ConsultarOperadores(Model.Parameter.FiltroOperador request)
        {
            IOperador servico = null;
            ModelCollection<Model.Operador> retorno = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);

                    retorno = new Translator.DataContractToModel.Operador().ToOperador
                                (
                                    servico.ConsultarOperadores(new Translator.ModelToDataContract.Operador().ToFiltroOperadorRequest(request))
                                );
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }

            return retorno;
        }

        #endregion        

        #region ConsultarSubordinados

        public ModelCollection<Model.Operador> ConsultarSubordinados(Model.Parameter.FiltroCodigoOperador request)
        {
            IOperador servico = null;
            ModelCollection<Model.Operador> retorno = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    retorno = new Translator.DataContractToModel.Operador().ToOperador
                                (
                                    servico.ConsultarSubordinados(new Translator.ModelToDataContract.Operador().ToFiltroCodigoOperadorRequest(request))
                                );
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }

            return retorno;
        }

        #endregion

        #region ConsultarIdentificacaoSubordinados

        public ModelCollection<Model.Operador> ConsultarIdentificacaoSubordinados(Model.Parameter.FiltroCodigoOperador request)
        {
            IOperador servico = null;
            ModelCollection<Model.Operador> retorno = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);

                    retorno = new Translator.DataContractToModel.Operador().ToOperador
                                (
                                    servico.ConsultarIdentificacaoSubordinados(new Translator.ModelToDataContract.Operador().ToFiltroCodigoOperadorRequest(request))
                                );
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }

            return retorno;
        }

        #endregion

        #region ExcluirOperador

        public void ExcluirOperadores(ModelCollection<Model.Parameter.FiltroCodigoOperador> request)
        {
            IOperador servico = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    
                    servico.ExcluirOperadores(new Translator.ModelToDataContract.Operador().ToFiltroCodigoOperadorRequest(request));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region ExcluirSubordinados

        public void ExcluirSubordinados(Model.OperadorXSubordinados request)
        {
            IOperador servico = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    servico.ExcluirSubordinados(new Translator.ModelToDataContract.Operador().ToOperadorXSubordinadosRequest(request));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region IncluirOperador

        public void IncluirOperador(Model.Operador request)
        {
            IOperador servico = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    servico.IncluirOperador(new Translator.ModelToDataContract.Operador().ToOperadorRequest(request));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region IncluirOperadores

        public void IncluirOperadores(ModelCollection<Model.Operador> request)
        {
            IOperador servico = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    servico.IncluirOperadores(new Translator.ModelToDataContract.Operador().ToOperadorRequest(request));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region IncluirSubordinados

        public void IncluirSubordinados(Model.OperadorXSubordinados request)
        {
            IOperador servico = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    servico.IncluirSubordinados(new Translator.ModelToDataContract.Operador().ToOperadorXSubordinadosRequest(request));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region IncluirRelacaoCorretoraOperador

        public void IncluirRelacaoCorretoraOperador(Model.Origem request)
        {
            IOperador servico = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    servico.IncluirRelacaoCorretoraOperador(new Translator.ModelToDataContract.Operador().ToOrigemRequest(request));                                                             
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion

        #region ExcluirRelacoesCorretoraOperador

        public void ExcluirRelacoesCorretoraOperador(ModelCollection<Model.Origem> request)
        {
            IOperador servico = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    servico.ExcluirRelacoesCorretoraOperador(new Translator.ModelToDataContract.Operador().ToOrigemRequest(request));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion        

        #region AlterarRelacaoCorretoraOperador

        public void AlterarRelacaoCorretoraOperador(Model.OrigemAnteriorAtual request)
        {
            IOperador servico = null;
            try
            {
                using (ServiceInstance<IOperador> service = new ServiceInstance<IOperador>())
                {
                    servico = service.TryGetInstance(this.Session);
                    servico.AlterarRelacaoCorretoraOperador(new Translator.ModelToDataContract.Operador().ToOrigemAnteriorAtualRequest(request));
                }
            }
            catch (Exception ex)
            {
                this.HandleFault(ex);
            }
        }

        #endregion
    }
}
